package com.deliccio.service.impl;

import java.io.IOException;
import java.util.Date;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import com.deliccio.dao.DetalleProductoDAO;
import com.deliccio.dao.EstadosgeneralesDAO;
import com.deliccio.dao.FotoDAO;
import com.deliccio.dao.ParametrosDAO;
import com.deliccio.dao.ProductoDAO;
import com.deliccio.dao.ProductoPorSucursalDAO;
import com.deliccio.dao.RankingDAO;
import com.deliccio.dao.SucursalesDAO;
import com.deliccio.entitys.DetalleProducto;
import com.deliccio.entitys.Estadosgenerales;
import com.deliccio.entitys.Foto;
import com.deliccio.entitys.Parametros;
import com.deliccio.entitys.Producto;
import com.deliccio.entitys.ProductoPorSucursal;
import com.deliccio.entitys.Ranking;
import com.deliccio.entitys.Sucursales;
import com.deliccio.service.MantenimientoProductosService;
import com.deliccio.util.Constantes;
import com.deliccio.util.Util;

@Service("MantenimientoProductosService")
public class MantenimientoProductosServiceImpl implements
		MantenimientoProductosService {

	private static Logger log = Logger.getLogger(MantenimientoProductosServiceImpl.class);

	@Autowired
	private ProductoDAO productoDAO;
	
	@Autowired
	private RankingDAO rankingDAO;
	
	@Autowired
	private FotoDAO fotoDAO;	
	
	@Autowired
	private ParametrosDAO parametrosDAO;

	@Autowired
	private EstadosgeneralesDAO estadosgeneralesDAO;
	
	@Autowired
	private DetalleProductoDAO detalleProductoDAO;
	
	@Autowired
	private ProductoPorSucursalDAO productoPorSucursalDAO;
	
	@Autowired
	private SucursalesDAO sucursalesDAO;
	
	
	@Override
	public List<Producto> obtenerProductos() {
		return productoDAO.obtenerActivos();
	}

	@Override
	public List<Parametros> obtenerConjuntos() {
		return parametrosDAO.obtenerTipoProductos();
	}

	@Override
	public String guardarImagenTemporal(MultipartFile archivoSubir,
			HttpServletRequest request) throws IOException, Exception {
		return Util.guardarImagenTemporal(archivoSubir, request);
	}
		

	@Override
	@Transactional
	public int guardarProducto(Ranking producto, int[] idAsignado, int x, int y, int w, int h,
			String fileRuta, String nameImage, String formato, int width, int height, HttpServletRequest request) {

		try {
			nameImage=Util.generarCodigo("producto",nameImage);
			Producto pTemp=productoDAO.get(producto.getId());
			Foto foto=null;
			if(pTemp!=null){
				if(pTemp.getFoto()!=null){
				foto=pTemp.getFoto();
				    	if(foto!=null){
				    		if(foto.getId()!=null){
				    			nameImage=foto.getNombre();
				    		}	    			
				    	}
				}
			}
			
			String rutaNueva=Constantes.ROOT_ROSOURCES +Constantes.ROOT_IMAGES +Constantes.ROOT_SLASH +Constantes.ROOT_FOL_PRODUCTO;

			log.info(" rutaNueva:"+rutaNueva);
			
			int result=Util.guardarImagen(x,y,w,h,fileRuta,nameImage,rutaNueva,formato,width,height,request);
			log.info(" result de guardar la Imagen con las dimensiones :"+result);
		    if(result>0){
		    	if(foto==null){
		    		foto= new Foto(nameImage,rutaNueva,Constantes.ROOT_FOL_PRODUCTO,nameImage);
			    	fotoDAO.guardar(foto);
		    	}else{
		    		Foto fotoExistente=fotoDAO.get(foto.getId());
		    		fotoExistente.setCarpeta(foto.getCarpeta());
		    		fotoExistente.setCodigo(foto.getCodigo());
		    		fotoExistente.setNombre(foto.getNombre());
		    		fotoExistente.setRuta(foto.getRuta());
			    	fotoDAO.guardar(foto);
		    	}
		    		    	
		    	producto.setFoto(foto);
	    		producto.setEstadosgenerales(new Estadosgenerales(1));	    		  
	    		producto.setPuntos(0);
	    		producto.setPuntasMesPasado(0);
	    		producto.setFechaActualizacion(new Date());
	    		producto.setFechaRegistro(new Date());
	    		
		    	if(producto.getId()==null){
		    		rankingDAO.guardar(producto);		    		
		    	}else{
		    		Ranking p=rankingDAO.get(producto.getId());
		    		p.setDescripcion(producto.getDescripcion());
		    		p.setCodigo(producto.getCodigo());
		    		p.setIdtipo(producto.getIdtipo());
		    		p.setNombre(producto.getNombre());
		    		p.setPrecioConjunto(producto.getPrecioConjunto());
		    		p.setPrecioUnitario(producto.getPrecioUnitario());
		    		p.setPuntos(producto.getPuntos());
		    		p.setPuntasMesPasado(producto.getPuntasMesPasado());
		    		p.setFechaActualizacion(producto.getFechaActualizacion());
		    		p.setFechaRegistro(producto.getFechaRegistro());
		    		p.setEstadosgenerales(producto.getEstadosgenerales());
		    		rankingDAO.guardar(p);
		    		producto=p;
		    	}
		    		if(idAsignado.length>0){
		    			for(int i=0;i < idAsignado.length;i++){
							Sucursales s=sucursalesDAO.get(idAsignado[i]);					
							ProductoPorSucursal productoPorSucursal=new ProductoPorSucursal(producto.getId(),s.getId(),new Estadosgenerales(1),5);
							productoPorSucursalDAO.guardar(productoPorSucursal);
						}
		    		}
		    	return 1;	    	
		    }
			
		} catch (Exception e) {
			e.printStackTrace();
		}

		return 0;
	}

	@Override
	public List<Estadosgenerales> obtenerEstados(){
		return estadosgeneralesDAO.obtenerEstadoPorTabla(Constantes.ACTIVOS);
	}

	@Override
	public List<Producto> obtenerListaProductosXTipo(int tipo){	
		if(tipo==3){
			tipo=6;
		}else{
			tipo=3;
		}	
		return productoDAO.obtenerProductosPorTipoConjunto(tipo);
	}

	@Override
	public Producto obtenerProducto(int id){
		Producto p = productoDAO.obtener(id);
		return p;
	}

	@Override
	public List<DetalleProducto> obtenerDetalleProducto(int id){
		return detalleProductoDAO.obtenerDetallePorProducto(id);
	}

	@Override
	public Foto buscarFoto(Foto foto ,HttpServletRequest request){
		String fileName=request.getRealPath("") + foto.getRuta()+ Constantes.ROOT_SLASH + foto.getNombre();
		foto.setIntWith(Util.getWithImagen(fileName));
		foto.setIntHeight(Util.getHeightImagen(fileName));		
		String ext=fileName.substring(fileName.lastIndexOf(".") + 1,fileName.length()).trim().toLowerCase();
		foto.setStrformato(ext);
		return foto;
	}

	@Override
	public List<Sucursales> obtenerSucursalesDisponibles(){
		return sucursalesDAO.obtenerSucursales();
	}

	@Override
	public List<Sucursales> obtenerSucursalesDisponibles(Producto p){		
		return sucursalesDAO.obtenerSucursalesDisponibles(p.getId());
	}

	@Override
	public List<Sucursales> obtenerSucursalesAsignados(Producto p){		
		return sucursalesDAO.obtenerSucursalesAsignados(p.getId());
	}
	
	
	 
	

}
